"""
对称加密：
信息的加密和解密都需要同一个秘钥


AES: advanced encryption standard 高级的加密标准

DES: data encryption standard  数据加密标准
"""


"""

AES算法详解：

首先这个算法需要通过秘钥来进行加密和解密。


pip install pycryptodome

官网：
https://www.pycryptodome.org/src/examples

AES算法的工作模式：

电子密码本模式（Electronic Codebook Mode, ECB）：

在ECB模式下，数据被分成大小相等的块，每个块独立加密。
优点是简单和速度快。
缺点是相同的明文块会产生相同的密文块，这可能会暴露数据模式，因此安全性较低。

密码块链接模式（Cipher Block Chaining Mode, CBC）
在CBC模式下，每个明文块在加密前会与前一个密文块进行异或操作。
这使得每个密文块依赖于之前的所有密文块，提高了安全性。
缺点是需要保留前一个块的密文，因此不能并行处理。


注意：
明文必须为16字节或者16字节的倍数，如果不够需要被填充


"""

# AES算法
from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes
from Crypto.Util.Padding import pad, unpad




"""


秘钥：加密的时候需要，解密的时候也需要，类型是二进制类型
明文： 在加密的时候也需要编码成二进制
模式：常用的模式就是 ECB和CBC模式，最大的区别是CBC模式需要随机向量
iv: 随机向量 用来增加安全性，大小是16个字节
填充：加密的数据必须是16个字节或者16个字节的倍数，如果不够就要填充
默认填充模式是 pkcs7，缺多少个字节，就用多少来填充
比如： 缺少 2个字节就要 2来填充

"""


"""
使用 cbc工作模式

"""
# 创建秘钥 必须是16个字节大小
# aes_key = "1234567887654321".encode("utf-8")  # 16个字节
#
# # 创建一个随机向量  为了增强安全性，如果手动设置随机向量，需要传给加密对象
# 不自己设置会加密对象会自己生成一个
# iv = "1234567887654321".encode("utf-8")  # 16个字节
# # 创建加密对象
# cipher = AES.new(aes_key, AES.MODE_CBC, iv=iv)
# # print(cipher, type(cipher))
#
#  iv = cipher.iv
#  print(iv)
# data = "今天是一个好日子".encode("utf-8")  # 明文
# pad_data = pad(data, 16)  # 填充，确保每个数据块都是16个字节
# cipher_text = cipher.encrypt(pad_data)  # 加密  二进制
# # print(cipher_text)
#
# # 解密
#
# cipher2 = AES.new(aes_key, AES.MODE_CBC, iv=iv)  # 创建解密对象
#
# text = cipher2.decrypt(cipher_text)  # 解密
# unpad_data = unpad(text, 16)   # 去掉填充， 结果为二进制数据
#
# print(unpad_data.decode("utf-8"))  # 解码



"""

使用ECB模式

Base64是一种编码方法，用于将二进制数据转换成由64个可打印字符组成的文本字符串

"""
import base64
# 秘钥
aes_key = "1234567887654321".encode("utf-8")  # 16个字节
cipher = AES.new(aes_key, AES.MODE_ECB)  # 加密对象

data = "今天是个好日子".encode("utf-8")
pad_data = pad(data, 16)
cipher_text = cipher.encrypt(pad_data)

res = base64.b64encode(cipher_text)
print(res.decode("utf-8"))
# print(cipher_text)


# 解密
# cipher = AES.new(aes_key, AES.MODE_ECB)  # 解密对象
# data = cipher.decrypt(cipher_text)
# unpad_data = unpad(data, 16)
# print(unpad_data.decode("utf-8"))




